# 画图的简单实现
# 练习
# 导入模块
import matplotlib.pyplot as plt
# 传入x和y时，括号中第一列表是x轴上的值，第二个列表是y上的值
x = [3,1,7]
y = [4,5,6]
plt.plot(x,y)
plt.savefig('./1.svg')

# 折线图
from matplotlib import pyplot as plt
x = range(1,8)
# y数组 的值不能多于x轴 否则属于...数组越界？哈
y = [1,2,3,14,6,3,7]
plt.plot(x,y)
plt.savefig('./2.svg')

# 折线颜色和形状设置
# 传入x和y, 通过plot画折线图
'''基础属性设置
 color='red' : 折线的颜色
 alpha=0.5 : 折线的透明度(0-1)
 linestyle='--' : 折线的样式
 linewidth=3 : 折线的宽度
 线的样式
 - 实线(solid)
 -- 短线(dashed)
 -. 短点相间线(dashdot)
 ：虚点线(dotted)
 '''
plt.plot(x, y, color='red',alpha=0.5,linestyle='--',linewidth=3)
plt.savefig('./3.svg')

# 折点样式
plt.plot(x,y,marker='*')
plt.savefig('./4.svg')

# 设置图片的大小和保存
from matplotlib import pyplot as plt
import random
x = range(2,20,2)
# y数组 = 随机生成的int数据 数据分布在12-50  长度=len(x)
y = [random.randint(12,50) for i in x]
# 设置图片的大小
'''
 figsize:指定figure的宽和高，单位为英寸；
 dpi参数指定绘图对象的分辨率，即每英寸多少个像素，缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
'''
# 设置画布对象
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y,linestyle='--')
# 保存(注意：要放在show的上面，plt.savefig('./1.svg')会释放figure资源，如果在显示图像之后保存图片将只能保存空图片。)
plt.savefig('./t1.svg')
#./表示放在当前python文件的目录
plt.savefig('./5.svg')
# 图片的格式也可以保存为svg这种矢量图格式，这种矢量图放在网页中放大后不会有锯齿
# plt.savefig('./t1.svg')


# 绘制x轴和y轴的刻度
from matplotlib import pyplot as plt
import random
x = range(2,20,2)
# y数组 = 随机生成的int数据 数据分布在该数字区间 该方法左右均可取到 长度=len(x)
y = [random.randint(12,50) for i in x]

# plt.xticks 设置x轴的刻度 rotation 将字体旋转度数
# "{}:00" 格式
x_ticks_label = ["{}:00".format(i) for i in x]
plt.xticks(x,x_ticks_label,rotation = 90)


# plt.yticks 设置y轴的刻度
# range(min(y),max(y)+1) 控制y轴产生的次数
y_ticks_label = ["{}:℃".format(i) for i in range(min(y),max(y)+1)]
# plt.yticks(range(min(y),max(y)+1),y_ticks_label)
plt.yticks(y,y_ticks_label)
#绘图
plt.plot(x,y)
plt.savefig('./6.svg')

# 设置显示中文
# matplotlib只显示英文，无法显示中文，需要修改matplotlib的默认字体。
# 通过模块font_manager使用中文字体解决。
# 例：
from matplotlib import pyplot as plt
import matplotlib
import random
x = range(0,120)
y = [random.randint(10,50) for i in x]
# 画布
plt.figure(figsize=(20,8),dpi=80)
# 绘图
plt.plot(x,y)
# 此处下方添加坐标轴信息
'''
查看windows\fonts 下的文件 
取一个中文字体来用
'''
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\AliHYAiHei.ttf",size=18)
plt.xlabel('时间',fontproperties=my_font,rotation=45)
plt.ylabel('次数',fontproperties=my_font)
# 设置标题
plt.title('每分钟跳动次数',fontproperties=my_font,color='blue')
plt.savefig('./7.svg')

# 一图多线
from matplotlib import pyplot as plt
from matplotlib import font_manager
import random
# x = range(1,11)
# y1=[random.randint(0,5) for i in x]
# y2=[random.randint(0,5) for i in x]
# y3=[random.randint(0,5) for i in x]
# print(y1,y2,y3)
y1=[3, 5, 3, 1, 2, 1, 1, 4, 4, 5, 5, 5, 2, 1, 2, 2, 0, 3, 0]
y2=[3, 4, 4, 5, 5, 2, 2, 1, 0, 3, 3, 3, 3, 5, 0, 5, 5, 3, 0]
y3=[2, 4, 0, 2, 0, 4, 3, 5, 4, 2, 1, 1, 1, 2, 5, 0, 2, 5, 3]

x = range(11,30)
# 设置图形
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y1,color='red',label='重生第一次')
plt.plot(x,y2,color='blue',label='重生第二次')
plt.plot(x,y3,color='green',label='重生第三次')

# plt.savefig('./8.svg') 此处报错 等待处理
# 设置x轴刻度
xticks_labels = ['{}岁'.format(i) for i in x]
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\AliHYAiHei.ttf",size=18)
plt.xticks(x,xticks_labels,fontproperties=my_font,rotation=45)
# 绘制网格
# alpha = 0.4 透明度
plt.grid(alpha=0.4)
# 添加图例
# 设置位置 loc:upper left、lower left、center left、upper center
plt.legend(prop=my_font,loc='upper right')
# 展示
plt.savefig('./9.svg')


# 拓展：一画布多坐标系（多表）、设置坐标轴范围
# 方法 add_subplot 给figure新增子图
import numpy as np
from matplotlib import pyplot as plt
s = range(1,100)
# 支持负数起始 控制坐标轴范围
x = list(range(1,100)) # 列表
x1 = np.arange(1,100,1) # 避免log 计算负数出现溢出
# 画布
fig = plt.figure(figsize=(20,10),dpi=80)

# 拓展：一画布多坐标系（多表）、设置坐标轴范围
# 方法 add_subplot 给figure新增子图
import numpy as np
from matplotlib import pyplot as plt
s = range(1,100)
# 支持负数起始 控制坐标轴范围
x = np.arange(-99,100,1) # 列表
x1 = np.arange(1,100,1) # 避免log 计算负数出现溢出
# 画布
fig = plt.figure(figsize=(20,10),dpi=80)

# 画布第一个子图
# 三排两行 第一个格子
ax1 = fig.add_subplot(3,2,1)
ax1.plot(x,x)
ax2 = fig.add_subplot(3,2,2)
# marker 折点省略
ax2.plot(x,x ** 2,linestyle='-.',linewidth=2)
ax2.grid(color='g',linestyle='--',linewidth=1,alpha=0.5)
ax3 = fig.add_subplot(3,2,3)
ax3.plot(x,x ** 3)
ax4 = fig.add_subplot(3,2,4)
ax4.plot(x1,np.log(x1))
ax5 = fig.add_subplot(3,2,5)
ax5.plot(x,x**2)
# 设置最小为0 ? 此处无此方法
# ax5.x1(xmin=0)
# ax5.yl(ymin=0)
plt.savefig('./10.svg')

# 设置坐标起始值
import numpy as np
from matplotlib import pyplot as plt
x = np.arange(-99,100,1)
plt.figure(figsize=(20,10),dpi=80)
plt.plot(x,x**2)
# 设置坐标起始值 在多图中无此方法 只能在单图使用该方法
plt.xlim(xmin=0)
plt.ylim(ymin=0)
plt.savefig('./11.svg')

# test
import numpy as np
from matplotlib import pyplot as plt
s = list(range(1,100))
x = np.arange(1,100)
print(s,x)   

# 运用Matplotlib,自己编数据设计样式，绘制一幅自己的折线图。
# 随机生成自己未来10年薪资 以及 存在的平行时空的薪资
# x轴薪资
# y轴10年
from matplotlib import pyplot as plt
from matplotlib import font_manager
import random
# 未来10年
x = range(1,10)
# 薪资
y1 = [random.randint(9,28)  for i in x] # 期待的未来
y2 = [random.randint(20,60) for i in x] # 平行时空2
y3 = [random.randint(30,50) for i in x] # 平行时空3
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y1,color='red',label='期待的未来',linestyle='--',linewidth=4)
plt.plot(x,y2,color='green',label='平行时空2')
plt.plot(x,y3,color='blue',label='平行时空3')

xticks_labels = ['{}year'.format(i) for i in x]
my_font= font_manager.FontProperties(fname="C:/Windows/Fonts/AliHYAiHei.ttf",size=18)
plt.xticks(x,xticks_labels,fontproperties=my_font,rotation=45)


yticks_labels = ['{}k'.format(i) for i in range(min(y1),max(y2)+1)]
plt.yticks(range(min(y1),max(y2)+1),yticks_labels)
plt.title("随机生成未来10年薪资 以及 可能存在的平行时空的薪资",fontproperties=my_font,color='red')
plt.legend(prop=my_font,loc='upper right')
plt.savefig('./12.svg')